package com.ckx.动物;

public class Test {
    public static void main(String[] args) {
//        向下转型
        Animal animal=new Bird("小鸟", 2);
        Bird bird=(Bird) animal;
        bird.fly();//不向下转型的话，需要在父类重写一个fly()方法，执行动态绑定
////////////////////////////////////////////////////////////////////////////
        Animal animal1=new Dog("旺财", 10);

//        animal这个引用是否引用了Bird这个对象
        if (animal1 instanceof Dog) {
            Dog dog = (Dog) animal1;
            dog.eat();
        }
        else {
            System.out.println("animal1 not instanceof Bird");
        }
    }
    public static void main2(String[] args) {
        Dog dog = new Dog("旺财", 10);
        func(dog);// 方法的传参
        Bird bird = new Bird("小鸟", 2);
        func(bird);
        //总结：animal引用的对象不一样，但是调用了同一个方法，此时表现出的现象不一样，
//             此时这种思想，就是多态
//        多态的实现条件
//        1，必须在继承条件下
//        2，子类必须对父类的方法进行重写
//        3，通过父类的引用调用重写的方法
//        当类的调用者在编写eat这个方法时，参数类型为父类Animal，但是该方法内部并不知道，也不关注当前的
//        animal引用指向哪个子类的实例，此时animal调用eat()方法会有不同的表现，这种行为就被称作多态。
    }

    public static void main1(String[] args) {
        //向上转型的
//        1，直接赋值
        Animal animal = new Dog("旺财", 10);

//      animal.bark(); 报错,只能调用父类自己的方法

//        动态绑定:程序在编译的时候,确实是调用了父类的构造方法,但是运行时,通过父类引用,调用的是父类和子类重写的那个方法,
//                结果实际调用了子类的方法
        animal.eat();
    }

    //    2, 方法的传参
    public static void func(Animal animal) {
        animal.eat();
    }
}
